<html><head><meta charset="utf-8"/><title>Date</title></head><body><h1>Date</h1><div class="x-wiki-content x-main-content">
 <p>
  在JavaScript中，
  <code>
   Date
  </code>
  对象用来表示日期和时间。
 </p>
 <p>
  要获取系统当前时间，用：
 </p>
 <pre><code>var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份，注意月份范围是0~11，5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳
</code></pre>
 <p>
  注意，当前时间是浏览器从本机操作系统获取的时间，所以不一定准确，因为用户可以把当前时间设定为任何值。
 </p>
 <p>
  如果要创建一个指定日期和时间的
  <code>
   Date
  </code>
  对象，可以用：
 </p>
 <pre><code>var d = new Date(2015, 5, 19, 20, 15, 30, 123);
d; // Fri Jun 19 2015 20:15:30 GMT+0800 (CST)
</code></pre>
 <p>
  你可能观察到了一个
  <em>
   非常非常坑爹
  </em>
  的地方，就是JavaScript的月份范围用整数表示是0~11，
  <code>
   0
  </code>
  表示一月，
  <code>
   1
  </code>
  表示二月……，所以要表示6月，我们传入的是
  <code>
   5
  </code>
  ！这绝对是JavaScript的设计者当时脑抽了一下，但是现在要修复已经不可能了。
 </p>
 <pre><code class="language-!">JavaScript的Date对象月份值从0开始，牢记0=1月，1=2月，2=3月，……，11=12月。
</code></pre>
 <p>
  第二种创建一个指定日期和时间的方法是解析一个符合
  <a href="http://www.w3.org/TR/NOTE-datetime">
   ISO 8601
  </a>
  格式的字符串：
 </p>
 <pre><code>var d = Date.parse('2015-06-24T19:49:22.875+08:00');
d; // 1435146562875
</code></pre>
 <p>
  但它返回的不是
  <code>
   Date
  </code>
  对象，而是一个时间戳。不过有时间戳就可以很容易地把它转换为一个
  <code>
   Date
  </code>
  ：
 </p>
 <pre><code>var d = new Date(1435146562875);
d; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
d.getMonth(); // 5
</code></pre>
 <pre><code class="language-!">使用Date.parse()时传入的字符串使用实际月份01~12，转换为Date对象后getMonth()获取的月份值为0~11。
</code></pre>
 <h3>
  时区
 </h3>
 <p>
  <code>
   Date
  </code>
  对象表示的时间总是按浏览器所在时区显示的，不过我们既可以显示本地时间，也可以显示调整后的UTC时间：
 </p>
 <pre><code>var d = new Date(1435146562875);
d.toLocaleString(); // '2015/6/24 下午7:49:22'，本地时间（北京时区+8:00），显示的字符串与操作系统设定的格式有关
d.toUTCString(); // 'Wed, 24 Jun 2015 11:49:22 GMT'，UTC时间，与本地时间相差8小时
</code></pre>
 <p>
  那么在JavaScript中如何进行时区转换呢？实际上，只要我们传递的是一个
  <code>
   number
  </code>
  类型的时间戳，我们就不用关心时区转换。任何浏览器都可以把一个时间戳正确转换为本地时间。
 </p>
 <p>
  时间戳是个什么东西？时间戳是一个自增的整数，它表示从1970年1月1日零时整的GMT时区开始的那一刻，到现在的毫秒数。假设浏览器所在电脑的时间是准确的，那么世界上无论哪个时区的电脑，它们此刻产生的时间戳数字都是一样的，所以，时间戳可以精确地表示一个时刻，并且与时区无关。
 </p>
 <p>
  所以，我们只需要传递时间戳，或者把时间戳从数据库里读出来，再让JavaScript自动转换为当地时间就可以了。
 </p>
 <p>
  要获取当前时间戳，可以用：
 </p>
 <pre><code class="language-x-javascript">'use strict';
----
if (Date.now) {
    console.log(Date.now()); // 老版本IE没有now()方法
} else {
    console.log(new Date().getTime());
}
</code></pre>
 <h3>
  练习
 </h3>
 <p>
  小明为了和女友庆祝情人节，特意制作了网页，并提前预定了法式餐厅。小明打算用JavaScript给女友一个惊喜留言：
 </p>
 <pre><code class="language-x-javascript">'use strict';
----
var today = new Date();
if (today.getMonth() === 2 &amp;&amp; today.getDate() === 14) {
    alert('亲爱的，我预定了晚餐，晚上6点在餐厅见！');
}
</code></pre>
 <p>
  结果女友并未出现。小明非常郁闷，请你帮忙分析他的JavaScript代码有何问题。
 </p>
 <p>
  <img alt="注孤生" data-src="/files/attachments/1024383789299456/l" src="https://www.liaoxuefeng.com/files/attachments/1024383789299456/l"/>
 </p>
</div>
</body></html>